<?php
/**
 * User: LRZ
 * Date: 2020/1/16
 * Time: 11:24
 */

/**
 *  832.翻转图片
 *
 *  标签：数组
 *
 *  给定一个二进制矩阵 A，我们想先水平翻转图像，然后反转图像并返回结果。
 *  水平翻转图片就是将图片的每一行都进行翻转，即逆序。例如，水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
 *  反转图片的意思是图片中的 0 全部被 1 替换， 1 全部被 0 替换。例如，反转 [0, 1, 1] 的结果是 [1, 0, 0]。
 *
 *  示例 1:
 *      输入: [[1,1,0],[1,0,1],[0,0,0]]
 *      输出: [[1,0,0],[0,1,0],[1,1,1]]
 *      解释: 首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]]；
 *            然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
 *
 *  示例 2:
 *      输入: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
 *      输出: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
 *      解释: 首先翻转每一行: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]；
 *            然后反转图片: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
 *
 *  说明:
 *      1 <= A.length = A[0].length <= 20
 *      0 <= A[i][j] <= 1
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/flipping-an-image
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$A   = [
    [1, 1, 0, 0],
    [1, 0, 0, 1],
    [0, 1, 1, 1],
    [1, 0, 1, 0]
];
$res = flipAndInvertImage($A);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function flipAndInvertImage($A)
{
    $size = count($A[0]);
    foreach ($A as $k => $v) {
        for ($i = 0; $i < $size / 2; $i++) {
            $temp                  = $v[$i] ^ 1;
            $A[$k][$i]             = $A[$k][$size - $i - 1] ^ 1;
            $A[$k][$size - $i - 1] = $temp;
        }
    }
    return $A;
}